<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /* 替换str中的sub子串为等长的*并返回替换后的新字符串 */
      function replaceAll(sub, str) {
        var newStr = str.replaceAll(sub, function (old) {
          console.log("处理函数被执行了", old);

          // 根据old的长度生成等长的*
          var newStr = "";
          for (var i = 0; i < old.length; i++) {
            newStr += "*";
          }

          // 处理函数返回一个新字符串去替换old
          return newStr;
        });

        return newStr;
      }

      function fn1() {
        var str = "asdasdNHasdfoolasdasdfoolsdasdasdNHsadasd";

        // 预先准备一个敏感词数组
        var dirtyWords = ["NH", "fool"];

        // 遍历敏感词数组，将遇到的所有敏感词都替换为等量的*
        dirtyWords.forEach(
          // 没每个元素做等量替换
          function (item, index) {
            console.log("befor:item/str", item, str);

            // NH全部替换完毕的结果直接覆盖原有str
            str = replaceAll(item, str);

            // item中的字符全部完成替换
            console.log("after:item/str", str);
          }
        );

        console.log(str);
      }
      //   fn1();

      /* 反转字符串 */
      function fn2() {
        var str = "abcdefg";

        // // 字符串肢解为字符数组
        // var arr = str.split("")
        // console.log(arr);

        // // 对数组反转
        // arr.reverse()
        // console.log(arr);

        // // 反转后的数组重新拼接为字符串
        // str = arr.join("")
        // console.log(str);

        str = str.split("").reverse().join("");
        console.log(str);
      }
      //   fn2()

      /* 统计字符个数 */
      function fn3() {
        var str = "abcdacbabcbababcbabcabd";

        // 事先准备一个空对象，用于统计字符出现的个数
        var obj = {};

        // 对字符串中的每个字符做遍历
        for (var i = 0; i < str.length; i++) {
          var a = str[i];

          // 当前字符a是首次出现：obj.a应为undefined，将其修改为obj.a=1
          //   if(obj[a]===undefined){
          if (!obj[a]) {
            obj[a] = 1;
          }

          // 当前字符a不是首次出现：obj.a应为一个数值，直接将其+1 obj.a++ 或 obj.a = obj.a +1
          else {
            obj[a]++;
          }
        }

        console.log(obj);
      }
      //   fn3()

      /* aabccd统计每个字符出现的次数，去掉重复的字符，使结果显示 acbd */
      function fn4() {
        var str = "aaccbabcdacbabcbababcbabcabd";

        // 准备一个用于字符统计的对象
        var obj = {};
        var unrepeatedStr = "";

        // 对str中的所有字符进行遍历
        for (var i = 0; i < str.length; i++) {
          var char = str[i];

          // 当前字符在obj中未注册/出现过=>该字符为首次出现，将首次出现的字符拼接到结果字符串
          if (!obj[char]) {
            unrepeatedStr += char;

            // 记录当前char已经出现过了
            obj[char] = true;
          }
          //   // 当前字符在obj中出现过（不是首次出现）
          //   else {
          //     //   什么都不做
          //   }
        }

        console.log(unrepeatedStr);
      }
      //   fn4()

      function fn4X() {
        var str = "aaccbabcdacbabcbababcbabcabd";

        var unrepeatedStr = "";

        // 对str中的每个字符做遍历
        for (var i = 0; i < str.length; i++) {
          var char = str[i];
          // 看看str.indexOf(当前字符)是否===当前下标
          str.indexOf(char) === i && (unrepeatedStr += char);
        }

        // console.log(unrepeatedStr);

        // 将字符号转换为数组+按码点排序+重新拼接会字符串
        console.log(unrepeatedStr.split("").sort().join(""));
      }
    //   fn4X();

    /* 判断字符串是否可回文字符串 */
    function fn5(){
        function isReversableStr(str){
            var reversedStr = str.split("").reverse().join("")
            return (reversedStr === str)
        }
        console.log( isReversableStr("今晚打老虎") );//false
        console.log( isReversableStr("黄山落叶松叶落山黄") );//true
    }
    // fn5()
    </script>
  </body>
</html>
